import moment from 'moment'


/**
 * 数字千分位格式化
 * 
 * @author jeffrey
 * @param {number, string} num 数字
 * @returns 返回一个将数字格式化成千分位分隔的数字
 * 
 */
export const format_number = (num) => {
  try {
    if(typeof num === 'number') {
      return num.toLocaleString()
    } else if (typeof num === 'string' && !isNaN(num)) {
      return Number(num).toLocaleString()
    } else {
      return num
    }
  } catch (err) {
    console.error(err)
  }
  
}

/**
 * 浮点精度格式化
 * 
 * @author jeffrey
 * @param {number, string} value 保留小数，默认为2
 * @param {number, string} num 保留小数，默认为2
 * @returns 返回一个保留num位小数但不包含0结尾的数值
 */
export const format_float = (value, num=2) => {
  try {
    if(!isNaN(value)) {
      return parseFloat((value).toFixed(num))
    } else {
      return value
    }
  } catch (err) {
    console.error(err)
  }
  
}

/**
 * 
 * 日期格式化
 * @author jeffrey
 * @param {Date} date 日期
 * @param {string} format 格式化模板（可选）
 * @returns 返回一个包含年、月、日的日期
 * 
 * new Date() 是为了传递moment合法的日期格式，否则格式如果是JSON.Date，会有如下告警
 * Deprecation warning: value provided is not in a recognized RFC2822 or ISO format.
 * 
 */
export const format_date = (date, format) => {
  try {
    if((date ?? '') !== '') {
      const result = moment(new Date(date)).format(format || 'YYYY-MM-DD')  // 
      return result !== 'Invalid date' ? result : date
    }
    return date
  } catch (err) {
    console.error(err)
  }
}


/**
 * 
 * 日期时间格式化
 * @author jeffrey
 * @param {Date} date 日期
 * @param {string} format 格式化模板（可选）
 * @returns 返回一个包含年、月、日、时、分、秒的日期
 * 
 * new Date() 是为了传递moment合法的日期格式，否则格式如果是JSON.Date，会有如下告警
 * Deprecation warning: value provided is not in a recognized RFC2822 or ISO format.
 * 
 */
export const format_dateTime = (date, format) => {
  try {
    if((date ?? '') !== '') {
      const result = moment(new Date(date)).format(format || 'YYYY-MM-DD HH:mm:ss')
      return result !== 'Invalid date' ? result : date
    }
    return date
  } catch (err) {
    console.error(err)
  }

}



/**
 * 表格空值转换
 * @author jeffrey
 * @param {Array} list 数据列表
 * @param {Array} ignoreProps 需要忽略的属性
 * @returns 返回一个新的数据列表，变量值为null、''或undefined且不再忽略属性内的，将被格式化成'- -'
 */
export const format_tableData_null = (list=[], ignoreProps=[]) => {
  try {
    return list.map(item => {
      Object.keys(item).forEach(propertyName => {
        if(!ignoreProps.includes(propertyName) && ((item[propertyName] ?? '') === '')) {
          item[propertyName] = '- -'
        }
      })
      return item
    })
  } catch (err) {
    console.error(err)
  }
}


export const format_null = (v, ignoreList=[]) => {
  if (v instanceof Array) {
    return v.map(item => format_null(item, ignoreList))
  } else {
    const obj = {}
    Object.keys(v).forEach(prop => {
      if(!ignoreList.includes(prop) && (v[prop] ?? '') === '') {
        obj[prop] = '- -'
      } else {
        obj[prop] = v[prop]
      }
    })
    return obj

  }
}


export default {
  format_number,
  format_date,
  format_dateTime,
  format_tableData_null
}